class SmaCrossCons(ConsStrategy):
# Class variable for parameters tuning
fast_days = 5
slow_days = 15
def init(self):
super().init()
self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
self.conservative = True
def next(self):
if crossover(self.fast_line, self.slow_line):
if len(self.trades) > 0:
self.trades[0].close()
self.buy()
elif crossover(self.slow_line, self.fast_line):
if len(self.trades) > 0:
self.trades[0].close()
if self.conservative == False:
self.sell()
super().init()
:繼承Strategy的初始化函式。params(self)
:用來記錄訓練後參數。
class ConsStrategy(Strategy):
def init(self):
super().init()
self.conservative = True
@property
def params(self):
return self._params
參數可藉由
backtesting.optimize()
進行參數優化。
# Class variable for parameters tuning
fast_days = 5
slow_days = 15
def init(self):
super().init()
self.fast_line = self.I(SMA, self.data.Close, self.fast_days)
self.slow_line = self.I(SMA, self.data.Close, self.slow_days)
self.conservative = True
def next(self):
if crossover(self.fast_line, self.slow_line):
if len(self.trades) > 0:
self.trades[0].close()
self.buy()
elif crossover(self.slow_line, self.fast_line):
if len(self.trades) > 0:
self.trades[0].close()
if self.conservative == False:
self.sell()
該語法會將之前的操作清空,作用等同於
exclusive_orders=True
。
if len(self.trades) > 0:
self.trades[0].close()
策略為激進時
self.conservative = False
,允許賣空。
if self.conservative == False:
self.sell()
test = Backtest(
data=df,
strategy=SmaCrossCons,
cash=10000000,
commission=0.004,
exclusive_orders=True,
hedging = True,
trade_on_close=True,
)
strategy
:回測策略。cash
:本金。commission
:交易手續費。hedging
:若為True
時,優先對之前操作進行抵銷。
Sell(1100)
、Buy(1000)
-> 賣空100Sell(1000)
、Buy(1100)
-> 買空100Sell(1000)
、Sell(1100)
-> 賣空2100exclusive_orders
:若為True
時,每次操作前自動關閉(close)上次操作。
Buy(500)
、Buy(1000)
-> 最後持股1000Buy(500)
、Sell(500)
-> 賣空500trade_on_close
:於收盤時交易,否則預設於開盤交易。對參數進行優化,尋找該策略下的最佳參數,
參數必須為Strategy的Class variable。
constraint
:限定組合必須符合特定條件
result = test.optimize(
fast_days=[5,10,15],
slow_days=[10,15,20],
constraint=lambda p: p.fast_days < p.slow_days,
)
最後的測試組合為:(5,10), (5,15), (5,20), (10,15), (10,20), (15,20)。
backtesting你的文檔可以寫得再爛點沒關係。